library("dplyr") 

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library("plyr") 
------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
------------------------------------------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
library("readr") 
library("readxl")
library("data.table") 
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.2 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********

Attaching package: ‘data.table’

The following objects are masked from ‘package:dplyr’:

    between, first, last
library(fpp)
Loading required package: forecast
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
Loading required package: fma

Attaching package: ‘fma’

The following object is masked from ‘package:plyr’:

    ozone

Loading required package: expsmooth
Loading required package: lmtest
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric

Loading required package: tseries

    ‘tseries’ version: 0.10-50

    ‘tseries’ is a package for time series analysis and computational finance.

    See ‘library(help="tseries")’ for details.
library(fpp2)
── Attaching packages ────────────────────────────────────────────────────────────────────────────────── fpp2 2.4 ──
✓ ggplot2 3.3.5     


Attaching package: ‘fpp2’

The following objects are masked from ‘package:fpp’:

    ausair, ausbeer, austa, austourists, debitcards, departures, elecequip, euretail, guinearice, oil,
    sunspotarea, usmelec
library(tseries)
library(forecast)
library(ggplot2)
library(stats)
library(TSA)
Registered S3 methods overwritten by 'TSA':
  method       from    
  fitted.Arima forecast
  plot.Arima   forecast

Attaching package: ‘TSA’

The following object is masked from ‘package:readr’:

    spec

The following objects are masked from ‘package:stats’:

    acf, arima

The following object is masked from ‘package:utils’:

    tar
path <- "/Users/shulundong/Desktop/Time Series Final Project/date.csv"
path2 <- "/Users/shulundong/Desktop/Time Series Final Project/weather_data_24hr.csv"
df <- fread(path, select = c("CRASH_DATE"))
df2 <- fread(path2, select = c("date", "totalprecipIn", "visibilityMiles"))

#Seperation of Date from 2016-2022 on Weather Dataset

df2_wk_seg <- df2[df2$date >= "2016-01-01"]
df2_wk_seg <- df2_wk_seg[df2_wk_seg$date < "2022-01-03"]
df2_wk_seg_fc <- df2[df2$date >= "2022-01-03"]
df2_wk_seg_fc <- df2_wk_seg_fc[df2_wk_seg_fc$date < "2022-05-01"]
df2_wk_seg <- df2_wk_seg[order(df2_wk_seg$date)]
df2_wk_seg$week <- as.Date(cut(df2_wk_seg$date, "week"))
df2_wk_seg_fc <- df2_wk_seg_fc[order(df2_wk_seg_fc$date)]
df2_wk_seg_fc$week <- as.Date(cut(df2_wk_seg_fc$date, "week"))
df2_wk_gp <- df2_wk_seg %>% group_by(week) %>%dplyr:: summarise(across(everything(), mean))
df2_wk_gp_fc <- df2_wk_seg_fc %>% group_by(week) %>%dplyr:: summarise(across(everything(), mean))

#Seperation of Date from 2016-2022 on Crashes Dataset

df_wk_seg <- df[df$CRASH_DATE >= "2016-01-01"]
df_wk_seg <- df_wk_seg[df_wk_seg$CRASH_DATE < "2022-01-03"]

df_wk_seg_fc <- df[df$CRASH_DATE >= "2022-01-03"]
df_wk_seg_fc <- df_wk_seg_fc[df_wk_seg_fc$CRASH_DATE < "2022-05-01"]
df_wk_seg <- df_wk_seg[order(df_wk_seg$CRASH_DATE)]
df_wk_seg$week <- as.Date(cut(df_wk_seg$CRASH_DATE, "week"))
df_wk_gp <- df_wk_seg %>% group_by(week) %>% dplyr::summarize(crashes = n())

#Validation set h=17

df_wk_seg_fc <- df_wk_seg_fc[order(df_wk_seg_fc$CRASH_DATE)]
df_wk_seg_fc$week <- as.Date(cut(df_wk_seg_fc$CRASH_DATE, "week"))
df_wk_gp_fc <- df_wk_seg_fc %>% group_by(week) %>% dplyr::summarize(crashes = n())

#Joining DF1 & Df2

df_combine <- merge(df2_wk_gp,df_wk_gp,by="week")
df_combine <- subset(df_combine, select = c('week', 'totalprecipIn', 'crashes', 'visibilityMiles'))
ts_wk2 <- ts(df_combine$crashes, frequency = 52)
ts_wk3 <- ts(df_combine$totalprecipIn, frequency = 52)
ts_wk4 <- ts(df_combine$visibilityMiles, frequency = 52)
autoplot(ts_wk2)

autoplot(ts_wk3)

autoplot(ts_wk4)

It looks like the series has a trend and some seasonality. There is a significant drop which is most likely caused by external event COVID-19.

fit_naive <- snaive(ts_wk2,lambda = 1.555455)
fit_naive
fc_naive <- forecast(fit_naive, h=17)
err_naive <- sqrt(mean((fc_naive$mean - df_wk_gp_fc$crashes)^2)) 
err_naive
[1] 205.5478
autoplot(diff(ts_wk2))

tsdisplay(ts_wk2)

BoxCox.lambda(ts_wk2)
[1] 1.555455
ts_wk_bc <- BoxCox(ts_wk2, lambda = 1.555455)
tsdisplay(diff(ts_wk_bc))

kpss.test(ts_wk2)
Warning in kpss.test(ts_wk2) : p-value smaller than printed p-value

    KPSS Test for Level Stationarity

data:  ts_wk2
KPSS Level = 2.3714, Truncation lag parameter = 5, p-value = 0.01
adf.test(ts_wk2)

    Augmented Dickey-Fuller Test

data:  ts_wk2
Dickey-Fuller = -1.9024, Lag order = 6, p-value = 0.6176
alternative hypothesis: stationary

Both tests show that the original series is not stationary.

kpss.test(diff(ts_wk_bc))
Warning in kpss.test(diff(ts_wk_bc)) :
  p-value greater than printed p-value

    KPSS Test for Level Stationarity

data:  diff(ts_wk_bc)
KPSS Level = 0.15216, Truncation lag parameter = 5, p-value = 0.1
adf.test(diff(ts_wk_bc))
Warning in adf.test(diff(ts_wk_bc)) :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  diff(ts_wk_bc)
Dickey-Fuller = -7.7343, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary

After first order differencing, we get a stationary series.

We firstly tried the auto arima to model the data.

fit_wk_auto <- auto.arima(ts_wk2, lambda = 1.555455, seasonal=TRUE)
fit_wk_auto
Series: ts_wk2 
ARIMA(0,1,1)(0,0,2)[52] with drift 
Box Cox transformation: lambda= 1.555455 

Coefficients:
          ma1    sma1    sma2     drift
      -0.4243  0.0773  0.2260  236.0806
s.e.   0.0525  0.0579  0.0683  433.6952

sigma^2 = 119664852:  log likelihood = -3355.98
AIC=6721.95   AICc=6722.15   BIC=6740.68
checkresiduals(fit_wk_auto)

    Ljung-Box test

data:  Residuals from ARIMA(0,1,1)(0,0,2)[52] with drift
Q* = 72.928, df = 59, p-value = 0.105

Model df: 4.   Total lags used: 63

The ACF shows several significant spikes within the lags. However, the Ljung-Box test gave p value > 0.05 and therefore, the residual looks much like the white noise.

Forecast next 16 weeks crash number with auto arima.

fc_wk2_auto <- forecast(fit_wk_auto, h=17)
autoplot(fc_wk2_auto)

Evaluation - RMSE

err_auto <- sqrt(mean((fc_wk2_auto$mean - df_wk_gp_fc$crashes)^2)) 
err_auto
[1] 276.825

We also want to try Exponential Smoothing method. As you have already found ets() does not work for high seasonal periods. The reason is that there are too many degrees of freedom associated with the seasonality — with period 52, there would be 51 degrees of freedom just on the seasonal component which makes little sense.

The ‘smoothing’ part of this method brushes over high and low variations. As the forecast graph shows a smooth line of data, it’s important to note that spikes in data aren’t necessarily represented.

fit_ets <- ets(ts_wk2, lambda = "auto")
Warning in ets(ts_wk2, lambda = "auto") :
  I can't handle data with frequency greater than 24. Seasonality will be ignored. Try stlf() if you need seasonal forecasts.
autoplot(forecast(fit_ets, h=17))

This seasonality rules out the use of ets models which can’t handle data with frequency greater than 24, unless used in combination with STL (Seasonal and Trend decomposition using Loess)

Holt Winter model

fit_hw_add <- hw(ts_wk2, damped=TRUE, seasonal='additive', h=17)
Error in ets(x, "AAA", alpha = alpha, beta = beta, gamma = gamma, phi = phi,  : 
  Frequency too high

STLF can be defined as Seasonal and Trend decomposition using Loess Forecasting model. The following code will decompose the time series using STL, and forecast the seasonally adjusted series with ETS, and return the reseasonalised forecasts.

fit_stlf <- stlf(ts_wk2, method='ets', h=17)
autoplot(fit_stlf)

err_stlf <- sqrt(mean((fit_stlf$mean- df_wk_gp_fc$crashes)^2)) 
err_stlf
[1] 243.2953

We will try to model the series with TBATS.

The variance has changed a lot over time, so it needs a transformation. • The seasonality has also changed shape over time, • and there is a strong trend. This makes it an ideal series to test the tbats() function which is designed to handle these features.

fit_wk2_tbats <- tbats(ts_wk2)
fit_wk2_tbats
TBATS(1, {0,0}, -, {<52,5>})

Call: tbats(y = ts_wk2)

Parameters
  Alpha: 0.5480914
  Gamma-1 Values: -0.008646206
  Gamma-2 Values: -0.007217537

Seed States:
             [,1]
 [1,]  727.285960
 [2,]  -47.979778
 [3,]    3.329315
 [4,]  -56.997318
 [5,]  -27.286547
 [6,]   17.268421
 [7,] -149.014345
 [8,]    4.959360
 [9,]   38.502313
[10,]  -32.771923
[11,]  -29.996358

Sigma: 161.2386
AIC: 5025.361
checkresiduals(fit_wk2_tbats)

    Ljung-Box test

data:  Residuals from TBATS
Q* = 75.769, df = 49, p-value = 0.0084

Model df: 14.   Total lags used: 63

fc_wk2_tbats <- forecast(fit_wk2_tbats, h=17)
autoplot(fc_wk2_tbats)

err_tbats <- sqrt(mean((fc_wk2_tbats$mean- df_wk_gp_fc$crashes)^2)) 
err_tbats
[1] 290.4389

We used Fourier transformation to transform a time-domain representation to a frequency- domain representation, we will use the Fourier transform to decompose the series since it got a dynamic seasonality.

We firstly did the spectrum analysis. Spectral analysis will identify the correlation of sine and cosine functions of different frequency with the observed data. If a large correlation (sine or cosine coefficient) is identified, you can conclude that there is a strong periodicity of the respective frequency (or period) in the data.

Spectral analysis is appropriate for the analysis of stationary time series and for identifying periodic signals that are corrupted by noise. However,spectral analysis is not suitable for non-stationary applications. One goal of spectral analysis is to identify the important frequencies (or periods) in the observed series.

kpss.test(ts_wk2)
Warning in kpss.test(ts_wk2) : p-value smaller than printed p-value

    KPSS Test for Level Stationarity

data:  ts_wk2
KPSS Level = 2.3714, Truncation lag parameter = 5, p-value = 0.01
ts_wk_bc_diff <- diff(ts_wk_bc)
kpss.test(ts_wk_bc_diff)
Warning in kpss.test(ts_wk_bc_diff) :
  p-value greater than printed p-value

    KPSS Test for Level Stationarity

data:  ts_wk_bc_diff
KPSS Level = 0.15216, Truncation lag parameter = 5, p-value = 0.1
adf.test(ts_wk_bc_diff)
Warning in adf.test(ts_wk_bc_diff) :
  p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  ts_wk_bc_diff
Dickey-Fuller = -7.7343, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary

***Not sure if this is right.

autoplot(ts_wk_bc_diff)

tsdisplay(ts_wk_bc_diff)

Too much noise, periodogram. Investigate one significant frequency.

temp <- periodogram(ts_wk_bc_diff)

max_freq <- temp$freq[which.max(temp$spec)]
max_freq
[1] 0.36875
seasonality <- 1/max_freq
seasonality
[1] 2.711864
fit_wk2_fourier <- auto.arima(ts_wk2, xreg=fourier(ts_wk2, 5), seasonal = FALSE, lambda = 1.555455)
fit_wk2_fourier
Series: ts_wk2 
Regression with ARIMA(0,1,1) errors 
Box Cox transformation: lambda= 1.555455 

Coefficients:
          ma1      S1-52      C1-52      S2-52      C2-52     S3-52      C3-52      S4-52      C4-52       S5-52
      -0.5107  -9870.436  -2053.814  -104.0771   661.7946   938.974  -4286.944  -2426.718  -216.6967  -1055.5990
s.e.   0.0503   3566.090   3554.647  1863.4394  1859.0888  1326.881   1325.249   1077.830  1077.5819    940.6372
          C5-52
      2004.9948
s.e.   941.0624

sigma^2 = 120654680:  log likelihood = -3350.9
AIC=6725.8   AICc=6726.84   BIC=6770.76
checkresiduals(fit_wk2_fourier)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(0,1,1) errors
Q* = 77.537, df = 52, p-value = 0.01237

Model df: 11.   Total lags used: 63

fc_wk2_fourier <- forecast(fit_wk2_fourier, xreg = fourier(ts_wk2,K = 5,h=17))
autoplot(fc_wk2_fourier)

bestfit <- list(aicc=Inf)
k = 0
for(i in 1:25)
{
  fit_fourier_best <-auto.arima(ts_wk2, xreg=fourier(ts_wk2, i), seasonal = FALSE, lambda = 1.555455)
  
  if(fit_fourier_best$aicc < bestfit$aicc){
    bestfit <- fit_fourier_best
    k = i
  }
}
fc_wk2_fourier_best <- forecast(bestfit, xreg=fourier(ts_wk2, K=13, h=17))
autoplot(fc_wk2_fourier_best)

bestfit
Series: ts_wk2 
Regression with ARIMA(1,1,1) errors 
Box Cox transformation: lambda= 1.555455 

Coefficients:
          ar1      ma1      S1-52      C1-52     S2-52      C2-52      S3-52      C3-52      S4-52      C4-52
      -0.1680  -0.3727  -9948.558  -1981.271  -133.413   716.6996   934.6597  -4236.877  -2421.367  -176.1832
s.e.   0.1075   0.1006   3586.074   3580.949  1836.836  1834.8779  1272.3847   1271.672   1003.376  1003.2829
           S5-52      C5-52      S6-52     C6-52     S7-52      C7-52       S8-52     C8-52       S9-52     C9-52
      -1037.0726  2042.7483  -119.8836  1302.395  642.4525  1142.2846  -1234.1802  1743.877  -1063.8719   25.3034
s.e.    851.8568   852.0661   758.5380   758.831  698.0701   698.2922    657.8543   657.909    630.9506  630.8152
         S10-52     C10-52      S11-52    C11-52      S12-52     C12-52     S13-52     C13-52
      -1734.638  -109.8238  -1652.6035  -35.5724  -1672.6484  -917.4102  -1167.566  1741.9501
s.e.    613.237   612.9466    602.1258  601.7811    595.9155   595.6520    593.417   593.4143

sigma^2 = 109337835:  log likelihood = -3326.42
AIC=6710.84   AICc=6716.99   BIC=6819.48
checkresiduals(bestfit)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(1,1,1) errors
Q* = 91.313, df = 35, p-value = 6.426e-07

Model df: 28.   Total lags used: 63

err_fourier_best <- sqrt(mean((fc_wk2_fourier_best$mean - df_wk_gp_fc$crashes)^2))
err_fourier_best
[1] 250.393

#Running ARIMA on two variables for car crashes (Percipitation)

autoplot(ts_wk3)

kpss.test(ts_wk3)

    KPSS Test for Level Stationarity

data:  ts_wk3
KPSS Level = 0.64392, Truncation lag parameter = 5, p-value = 0.01864
kpss.test(ts_wk4)

    KPSS Test for Level Stationarity

data:  ts_wk4
KPSS Level = 0.72275, Truncation lag parameter = 5, p-value = 0.01148
autoplot(diff(ts_wk3))

kpss.test(diff(ts_wk3))
Warning in kpss.test(diff(ts_wk3)) :
  p-value greater than printed p-value

    KPSS Test for Level Stationarity

data:  diff(ts_wk3)
KPSS Level = 0.018856, Truncation lag parameter = 5, p-value = 0.1
length(diff(ts_wk3))
[1] 313
fit_wk_auto_percip <- auto.arima(ts_wk2, xreg = ts_wk3, lambda = 1.368373, seasonal=TRUE)
fit_wk_auto_percip
Series: ts_wk2 
Regression with ARIMA(0,1,1)(0,0,2)[52] errors 
Box Cox transformation: lambda= 1.368373 

Coefficients:
          ma1    sma1    sma2     drift      xreg
      -0.4034  0.0780  0.2355   64.2193  291.1018
s.e.   0.0536  0.0582  0.0696  109.3153  687.1749

sigma^2 = 7021318:  log likelihood = -2911.9
AIC=5835.81   AICc=5836.08   BIC=5858.28
checkresiduals(fit_wk_auto_percip)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(0,1,1)(0,0,2)[52] errors
Q* = 72.175, df = 58, p-value = 0.09979

Model df: 5.   Total lags used: 63

fc_wk_auto_percip <- forecast(fit_wk_auto_percip, xreg = df2_wk_gp_fc$totalprecipIn ,h=17)
autoplot(fc_wk_auto_percip)

If differencing is specified, then the differencing is applied to all variables in the regression model before the model is estimated.If differencing is required, then all variables are differenced during the estimation process, although the final model will be expressed in terms of the original variables.

#Running ARIMA MAX on two variables for car crashes (Visibility)

fit_wk_auto_visibility <- auto.arima(ts_wk2, xreg = ts_wk4, lambda = 1.368373, seasonal=TRUE)
fit_wk_auto_visibility
Series: ts_wk2 
Regression with ARIMA(1,1,1)(0,0,2)[52] errors 
Box Cox transformation: lambda= 1.368373 

Coefficients:
         ar1      ma1    sma1    sma2     drift       xreg
      0.0589  -0.4496  0.0781  0.2348   64.5611  -511.5991
s.e.  0.1393   0.1251  0.0579  0.0691  106.5097   259.8333

sigma^2 = 6960542:  log likelihood = -2910.02
AIC=5834.03   AICc=5834.4   BIC=5860.26
checkresiduals(fit_wk_auto_visibility)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(1,1,1)(0,0,2)[52] errors
Q* = 69.157, df = 57, p-value = 0.1297

Model df: 6.   Total lags used: 63

fc_wk_auto_visibility <- forecast(fit_wk_auto_visibility, xreg = df2_wk_gp_fc$visibilityMiles ,h=17)
autoplot(fc_wk_auto_visibility)

#Running ARIMA MAX on two variables for car crashes (totalprecipIn & visibility)

xreg = cbind(Percipitation = ts_wk3, Visibility = ts_wk4)
fit_wk_auto_both <- auto.arima(ts_wk2, xreg = xreg, lambda = 1.368373, seasonal=TRUE)
fit_wk_auto_both
Series: ts_wk2 
Regression with ARIMA(0,1,1)(0,0,1)[52] errors 
Box Cox transformation: lambda= 1.368373 

Coefficients:
          ma1    sma1  Percipitation  Visibility
      -0.4069  0.1007      -134.4997   -534.2200
s.e.   0.0540  0.0512       774.4471    287.7701

sigma^2 = 7326247:  log likelihood = -2916.26
AIC=5842.52   AICc=5842.72   BIC=5861.25
checkresiduals(fit_wk_auto_both)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(0,1,1)(0,0,1)[52] errors
Q* = 70.201, df = 59, p-value = 0.1508

Model df: 4.   Total lags used: 63

xreg_fc = cbind(Percipitation = df2_wk_gp_fc$totalprecipIn, Visibility = df2_wk_gp_fc$visibilityMiles)
fc_wk_auto_both <- forecast(fit_wk_auto_both, xreg = xreg_fc ,h=17)
autoplot(fc_wk_auto_both)

Evaluation of ARIMAX model

fc_wk_auto_both

RMSE

err_arimax_both <- sqrt(mean((fc_wk_auto_both$mean - df_wk_gp_fc$crashes)^2)) 
err_arimax_both
[1] 236.3234

#Cross Validation This method has the benefit of providing a much more robust estimation of how the chosen modeling method and parameters will perform in practice.

#Intervention Analysis It looks like that starting from the week of 2020-03-16, the weekly crash number has a significant drop. We assumed that this drop is very likely caused by the external event - COVID-19. Due to the quarantine, there were less traffic on the road and therefore, led to less car accidents.

It appears that there is a drastic shift in the series, that slowly increased and eventually returns to previous levels. This may indicate an intervention model with a pulse function which is typically employed if the effects are expected to be only temporary, and decay over time.

Auto Arima: ARIMA(0,1,1)(0,0,1)[52]

Analysis with Pulse function

covid <- 1*(ts_wk2 == 1232)
fit_intv_model <- arimax(log(ts_wk2), order=c(0,1,1), seasonal=list(order=c(0,0,1),period=52), xreg=xreg, xtransf=covid, transfer=list(c(1,0)), method = 'ML')
fit_intv_model

Call:
arimax(x = log(ts_wk2), order = c(0, 1, 1), seasonal = list(order = c(0, 0, 
    1), period = 52), xreg = xreg, method = "ML", xtransf = covid, transfer = list(c(1, 
    0)))

Coefficients:
          ma1    sma1  Percipitation  Visibility  T1-AR1   T1-MA0
      -0.5170  0.2495         0.0061     -0.0245  0.9397  -0.7534
s.e.   0.0638  0.0667         0.0308      0.0115  0.0293   0.0933

sigma^2 estimated as 0.01126:  log likelihood = 256.15,  aic = -500.3
checkresiduals(fit_intv_model)

    Ljung-Box test

data:  Residuals from ARIMA(0,1,1)(0,0,1)[52]
Q* = 66.045, df = 57, p-value = 0.1928

Model df: 6.   Total lags used: 63

fit_intv_model$coef
          ma1          sma1 Percipitation    Visibility        T1-AR1        T1-MA0 
 -0.517029810   0.249475933   0.006148913  -0.024489411   0.939704695  -0.753388853 
covidx <- c(covid, rep(0,17))
intv_pulse <- fit_intv_model$coef["T1-MA0"]+stats::filter(covidx, filter=fit_intv_model$coef["T1-AR1"], method="recursive", side=1)
intv_pulse_x <- Arima(log(ts_wk2), order=c(0,1,1), seasonal=list(order=c(0,0,1),period=52), xreg=intv_pulse[1:length(ts_wk2)])
intv_pulse_x
Series: log(ts_wk2) 
Regression with ARIMA(0,1,1)(0,0,1)[52] errors 

Coefficients:
          ma1    sma1     xreg
      -0.5214  0.2532  -0.7467
s.e.   0.0639  0.0667   0.0935

sigma^2 = 0.01159:  log likelihood = 253.17
AIC=-498.34   AICc=-498.21   BIC=-483.35
checkresiduals(intv_pulse_x)

    Ljung-Box test

data:  Residuals from Regression with ARIMA(0,1,1)(0,0,1)[52] errors
Q* = 69.706, df = 60, p-value = 0.1834

Model df: 3.   Total lags used: 63

intv_pulse_fc <- forecast(intv_pulse_x, h=17, xreg=intv_pulse[(length(ts_wk2)+1):(length(ts_wk2)+17)] )
intv_pulse_fc
autoplot(intv_pulse_fc)

err_intv_pulse <- sqrt(mean((exp(intv_pulse_fc$mean) - df_wk_gp_fc$crashes)^2)) 
err_intv_pulse
[1] 179.2215

Analysis with Step function

covid_step <- 1*(seq(ts_wk2) >= 221)
fit_intv_step <- arimax(log(ts_wk2), order=c(0,1,1), seasonal=list(order=c(0,0,1),period=52), xreg=xreg, xtransf=covid_step, transfer=list(c(1,0)), method = 'ML')
fit_intv_step

Call:
arimax(x = log(ts_wk2), order = c(0, 1, 1), seasonal = list(order = c(0, 0, 
    1), period = 52), xreg = xreg, method = "ML", xtransf = covid_step, transfer = list(c(1, 
    0)))

Coefficients:
          ma1    sma1  Percipitation  Visibility  T1-AR1   T1-MA0
      -0.4415  0.2360         0.0046     -0.0236  0.2591  -0.6278
s.e.   0.0636  0.0655         0.0303      0.0113  0.0979   0.0914

sigma^2 estimated as 0.01126:  log likelihood = 256.45,  aic = -500.9
checkresiduals(fit_intv_step)

    Ljung-Box test

data:  Residuals from ARIMA(0,1,1)(0,0,1)[52]
Q* = 61.051, df = 57, p-value = 0.3325

Model df: 6.   Total lags used: 63

covidx_step <- c(covid_step,  rep(1,18))
intv_step <- fit_intv_step$coef["T1-MA0"]+stats::filter(covidx_step, filter=fit_intv_step$coef["T1-AR1"], method="recursive", side=1)
intv_step_x <- Arima(log(ts_wk2), order=c(0,1,1), seasonal=list(order=c(0,0,1),period=52), xreg=intv_step[1:length(ts_wk2)])
intv_step_x
Series: log(ts_wk2) 
Regression with ARIMA(0,1,1)(0,0,1)[52] errors 

Coefficients:
          ma1    sma1     xreg
      -0.4468  0.2405  -0.6225
s.e.   0.0627  0.0653   0.0802

sigma^2 = 0.01157:  log likelihood = 253.63
AIC=-499.26   AICc=-499.13   BIC=-484.27
intv_step_fc <- forecast(intv_step_x, h=17, xreg=intv_step[(length(ts_wk2)+1):(length(ts_wk2)+17)] )
autoplot(intv_step_fc)

exp(intv_step_fc$mean)
Time Series:
Start = c(7, 3) 
End = c(7, 19) 
Frequency = 52 
 [1] 1675.332 1697.196 1685.166 1734.467 1822.278 1783.975 1840.151 1744.727 1712.171 1695.541 1736.030 1755.169
[13] 1765.959 1752.744 1724.059 1722.883 1782.578
err_intv_step <- sqrt(mean((exp(intv_step_fc$mean) - df_wk_gp_fc$crashes)^2)) 
err_intv_step
[1] 205.1181
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KCJkcGx5ciIpIApsaWJyYXJ5KCJwbHlyIikgCmxpYnJhcnkoInJlYWRyIikgCmxpYnJhcnkoInJlYWR4bCIpCmxpYnJhcnkoImRhdGEudGFibGUiKSAKbGlicmFyeShmcHApCmxpYnJhcnkoZnBwMikKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3RhdHMpCmxpYnJhcnkoVFNBKQpgYGAKCmBgYHtyfQpwYXRoIDwtICIvVXNlcnMvc2h1bHVuZG9uZy9EZXNrdG9wL1RpbWUgU2VyaWVzIEZpbmFsIFByb2plY3QvZGF0ZS5jc3YiCnBhdGgyIDwtICIvVXNlcnMvc2h1bHVuZG9uZy9EZXNrdG9wL1RpbWUgU2VyaWVzIEZpbmFsIFByb2plY3Qvd2VhdGhlcl9kYXRhXzI0aHIuY3N2IgpkZiA8LSBmcmVhZChwYXRoLCBzZWxlY3QgPSBjKCJDUkFTSF9EQVRFIikpCmRmMiA8LSBmcmVhZChwYXRoMiwgc2VsZWN0ID0gYygiZGF0ZSIsICJ0b3RhbHByZWNpcEluIiwgInZpc2liaWxpdHlNaWxlcyIpKQpgYGAKCiNTZXBlcmF0aW9uIG9mIERhdGUgZnJvbSAyMDE2LTIwMjIgb24gV2VhdGhlciBEYXRhc2V0CmBgYHtyfQpkZjJfd2tfc2VnIDwtIGRmMltkZjIkZGF0ZSA+PSAiMjAxNi0wMS0wMSJdCmRmMl93a19zZWcgPC0gZGYyX3drX3NlZ1tkZjJfd2tfc2VnJGRhdGUgPCAiMjAyMi0wMS0wMyJdCmRmMl93a19zZWdfZmMgPC0gZGYyW2RmMiRkYXRlID49ICIyMDIyLTAxLTAzIl0KZGYyX3drX3NlZ19mYyA8LSBkZjJfd2tfc2VnX2ZjW2RmMl93a19zZWdfZmMkZGF0ZSA8ICIyMDIyLTA1LTAxIl0KYGBgCmBgYHtyfQpkZjJfd2tfc2VnIDwtIGRmMl93a19zZWdbb3JkZXIoZGYyX3drX3NlZyRkYXRlKV0KZGYyX3drX3NlZyR3ZWVrIDwtIGFzLkRhdGUoY3V0KGRmMl93a19zZWckZGF0ZSwgIndlZWsiKSkKZGYyX3drX3NlZ19mYyA8LSBkZjJfd2tfc2VnX2ZjW29yZGVyKGRmMl93a19zZWdfZmMkZGF0ZSldCmRmMl93a19zZWdfZmMkd2VlayA8LSBhcy5EYXRlKGN1dChkZjJfd2tfc2VnX2ZjJGRhdGUsICJ3ZWVrIikpCmBgYApgYGB7cn0KZGYyX3drX2dwIDwtIGRmMl93a19zZWcgJT4lIGdyb3VwX2J5KHdlZWspICU+JWRwbHlyOjogc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIG1lYW4pKQpkZjJfd2tfZ3BfZmMgPC0gZGYyX3drX3NlZ19mYyAlPiUgZ3JvdXBfYnkod2VlaykgJT4lZHBseXI6OiBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWVhbikpCmBgYAoKI1NlcGVyYXRpb24gb2YgRGF0ZSBmcm9tIDIwMTYtMjAyMiBvbiBDcmFzaGVzIERhdGFzZXQKYGBge3J9CmRmX3drX3NlZyA8LSBkZltkZiRDUkFTSF9EQVRFID49ICIyMDE2LTAxLTAxIl0KZGZfd2tfc2VnIDwtIGRmX3drX3NlZ1tkZl93a19zZWckQ1JBU0hfREFURSA8ICIyMDIyLTAxLTAzIl0KCmRmX3drX3NlZ19mYyA8LSBkZltkZiRDUkFTSF9EQVRFID49ICIyMDIyLTAxLTAzIl0KZGZfd2tfc2VnX2ZjIDwtIGRmX3drX3NlZ19mY1tkZl93a19zZWdfZmMkQ1JBU0hfREFURSA8ICIyMDIyLTA1LTAxIl0KYGBgCgoKCmBgYHtyfQpkZl93a19zZWcgPC0gZGZfd2tfc2VnW29yZGVyKGRmX3drX3NlZyRDUkFTSF9EQVRFKV0KYGBgCmBgYHtyfQpkZl93a19zZWckd2VlayA8LSBhcy5EYXRlKGN1dChkZl93a19zZWckQ1JBU0hfREFURSwgIndlZWsiKSkKYGBgCmBgYHtyfQpkZl93a19ncCA8LSBkZl93a19zZWcgJT4lIGdyb3VwX2J5KHdlZWspICU+JSBkcGx5cjo6c3VtbWFyaXplKGNyYXNoZXMgPSBuKCkpCmBgYAoKI1ZhbGlkYXRpb24gc2V0IGg9MTcKYGBge3J9CmRmX3drX3NlZ19mYyA8LSBkZl93a19zZWdfZmNbb3JkZXIoZGZfd2tfc2VnX2ZjJENSQVNIX0RBVEUpXQpkZl93a19zZWdfZmMkd2VlayA8LSBhcy5EYXRlKGN1dChkZl93a19zZWdfZmMkQ1JBU0hfREFURSwgIndlZWsiKSkKYGBgCgpgYGB7cn0KZGZfd2tfZ3BfZmMgPC0gZGZfd2tfc2VnX2ZjICU+JSBncm91cF9ieSh3ZWVrKSAlPiUgZHBseXI6OnN1bW1hcml6ZShjcmFzaGVzID0gbigpKQpgYGAKCiNKb2luaW5nIERGMSAmIERmMgpgYGB7cn0KZGZfY29tYmluZSA8LSBtZXJnZShkZjJfd2tfZ3AsZGZfd2tfZ3AsYnk9IndlZWsiKQpkZl9jb21iaW5lIDwtIHN1YnNldChkZl9jb21iaW5lLCBzZWxlY3QgPSBjKCd3ZWVrJywgJ3RvdGFscHJlY2lwSW4nLCAnY3Jhc2hlcycsICd2aXNpYmlsaXR5TWlsZXMnKSkKYGBgCgpgYGB7cn0KdHNfd2syIDwtIHRzKGRmX2NvbWJpbmUkY3Jhc2hlcywgZnJlcXVlbmN5ID0gNTIpCnRzX3drMyA8LSB0cyhkZl9jb21iaW5lJHRvdGFscHJlY2lwSW4sIGZyZXF1ZW5jeSA9IDUyKQp0c193azQgPC0gdHMoZGZfY29tYmluZSR2aXNpYmlsaXR5TWlsZXMsIGZyZXF1ZW5jeSA9IDUyKQpgYGAKCmBgYHtyfQphdXRvcGxvdCh0c193azIpCmF1dG9wbG90KHRzX3drMykKYXV0b3Bsb3QodHNfd2s0KQpgYGAKSXQgbG9va3MgbGlrZSB0aGUgc2VyaWVzIGhhcyBhIHRyZW5kIGFuZCBzb21lIHNlYXNvbmFsaXR5LiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGRyb3Agd2hpY2ggaXMgbW9zdCBsaWtlbHkgY2F1c2VkIGJ5IGV4dGVybmFsIGV2ZW50IENPVklELTE5LiAKCmBgYHtyfQpmaXRfbmFpdmUgPC0gc25haXZlKHRzX3drMixsYW1iZGEgPSAxLjU1NTQ1NSkKZml0X25haXZlCmBgYAoKYGBge3J9CmZjX25haXZlIDwtIGZvcmVjYXN0KGZpdF9uYWl2ZSwgaD0xNykKYGBgCmBgYHtyfQplcnJfbmFpdmUgPC0gc3FydChtZWFuKChmY19uYWl2ZSRtZWFuIC0gZGZfd2tfZ3BfZmMkY3Jhc2hlcyleMikpIAplcnJfbmFpdmUKYGBgCgpgYGB7cn0KYXV0b3Bsb3QoZGlmZih0c193azIpKQpgYGAKYGBge3J9CnRzZGlzcGxheSh0c193azIpCmBgYApgYGB7cn0KQm94Q294LmxhbWJkYSh0c193azIpCmBgYApgYGB7cn0KdHNfd2tfYmMgPC0gQm94Q294KHRzX3drMiwgbGFtYmRhID0gMS41NTU0NTUpCmBgYAoKCmBgYHtyfQp0c2Rpc3BsYXkoZGlmZih0c193a19iYykpCmBgYApgYGB7cn0Ka3Bzcy50ZXN0KHRzX3drMikKYGBgCmBgYHtyfQphZGYudGVzdCh0c193azIpCmBgYApCb3RoIHRlc3RzIHNob3cgdGhhdCB0aGUgb3JpZ2luYWwgc2VyaWVzIGlzIG5vdCBzdGF0aW9uYXJ5LgoKYGBge3J9Cmtwc3MudGVzdChkaWZmKHRzX3drX2JjKSkKYGBgCmBgYHtyfQphZGYudGVzdChkaWZmKHRzX3drX2JjKSkKYGBgCgpBZnRlciBmaXJzdCBvcmRlciBkaWZmZXJlbmNpbmcsIHdlIGdldCBhIHN0YXRpb25hcnkgc2VyaWVzLgoKV2UgZmlyc3RseSB0cmllZCB0aGUgYXV0byBhcmltYSB0byBtb2RlbCB0aGUgZGF0YS4KCmBgYHtyfQpmaXRfd2tfYXV0byA8LSBhdXRvLmFyaW1hKHRzX3drMiwgbGFtYmRhID0gMS41NTU0NTUsIHNlYXNvbmFsPVRSVUUpCmBgYApgYGB7cn0KZml0X3drX2F1dG8KYGBgCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhmaXRfd2tfYXV0bykKYGBgClRoZSBBQ0Ygc2hvd3Mgc2V2ZXJhbCBzaWduaWZpY2FudCBzcGlrZXMgd2l0aGluIHRoZSBsYWdzLiBIb3dldmVyLCB0aGUgTGp1bmctQm94IHRlc3QgZ2F2ZSBwIHZhbHVlID4gMC4wNSBhbmQgdGhlcmVmb3JlLCB0aGUgcmVzaWR1YWwgbG9va3MgbXVjaCBsaWtlIHRoZSB3aGl0ZSBub2lzZS4KCkZvcmVjYXN0IG5leHQgMTYgd2Vla3MgY3Jhc2ggbnVtYmVyIHdpdGggYXV0byBhcmltYS4KYGBge3J9CmZjX3drMl9hdXRvIDwtIGZvcmVjYXN0KGZpdF93a19hdXRvLCBoPTE3KQpgYGAKCmBgYHtyfQphdXRvcGxvdChmY193azJfYXV0bykKYGBgCkV2YWx1YXRpb24gLSBSTVNFCgpgYGB7cn0KZXJyX2F1dG8gPC0gc3FydChtZWFuKChmY193azJfYXV0byRtZWFuIC0gZGZfd2tfZ3BfZmMkY3Jhc2hlcyleMikpIAplcnJfYXV0bwpgYGAKCgpXZSBhbHNvIHdhbnQgdG8gdHJ5IEV4cG9uZW50aWFsIFNtb290aGluZyBtZXRob2QuCkFzIHlvdSBoYXZlIGFscmVhZHkgZm91bmQgZXRzKCkgZG9lcyBub3Qgd29yayBmb3IgaGlnaCBzZWFzb25hbCBwZXJpb2RzLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlcmUgYXJlIHRvbyBtYW55IGRlZ3JlZXMgb2YgZnJlZWRvbSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYXNvbmFsaXR5IC0tLSB3aXRoIHBlcmlvZCA1MiwgdGhlcmUgd291bGQgYmUgNTEgZGVncmVlcyBvZiBmcmVlZG9tIGp1c3Qgb24gdGhlIHNlYXNvbmFsIGNvbXBvbmVudCB3aGljaCBtYWtlcyBsaXR0bGUgc2Vuc2UuCgpUaGUg4oCYc21vb3RoaW5n4oCZIHBhcnQgb2YgdGhpcyBtZXRob2QgYnJ1c2hlcyBvdmVyIGhpZ2ggYW5kIGxvdyB2YXJpYXRpb25zLiBBcyB0aGUgZm9yZWNhc3QgZ3JhcGggc2hvd3MgYSBzbW9vdGggbGluZSBvZiBkYXRhLCBpdOKAmXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBzcGlrZXMgaW4gZGF0YSBhcmVu4oCZdCBuZWNlc3NhcmlseSByZXByZXNlbnRlZC4KCgpgYGB7cn0KZml0X2V0cyA8LSBldHModHNfd2syLCBsYW1iZGEgPSAiYXV0byIpCmBgYApgYGB7cn0KYXV0b3Bsb3QoZm9yZWNhc3QoZml0X2V0cywgaD0xNykpCmBgYAoKVGhpcyBzZWFzb25hbGl0eSBydWxlcyBvdXQgdGhlIHVzZSBvZiBldHMgbW9kZWxzIHdoaWNoIGNhbid0IGhhbmRsZSBkYXRhIHdpdGggZnJlcXVlbmN5IGdyZWF0ZXIgdGhhbiAyNCwgdW5sZXNzIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBTVEwgKFNlYXNvbmFsIGFuZCBUcmVuZCBkZWNvbXBvc2l0aW9uIHVzaW5nIExvZXNzKQoKCkhvbHQgV2ludGVyIG1vZGVsCgpgYGB7cn0KZml0X2h3X2FkZCA8LSBodyh0c193azIsIGRhbXBlZD1UUlVFLCBzZWFzb25hbD0nYWRkaXRpdmUnLCBoPTE3KQpgYGAKClNUTEYgY2FuIGJlIGRlZmluZWQgYXMgU2Vhc29uYWwgYW5kIFRyZW5kIGRlY29tcG9zaXRpb24gdXNpbmcgTG9lc3MgRm9yZWNhc3RpbmcgbW9kZWwuIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGRlY29tcG9zZSB0aGUgdGltZSBzZXJpZXMgdXNpbmcgU1RMLCBhbmQgZm9yZWNhc3QgdGhlIHNlYXNvbmFsbHkgYWRqdXN0ZWQgc2VyaWVzIHdpdGggRVRTLCBhbmQgcmV0dXJuIHRoZSByZXNlYXNvbmFsaXNlZCBmb3JlY2FzdHMuCgpgYGB7cn0KZml0X3N0bGYgPC0gc3RsZih0c193azIsIG1ldGhvZD0nZXRzJywgaD0xNykKYGBgCgoKYGBge3J9CmF1dG9wbG90KGZpdF9zdGxmKQpgYGAKYGBge3J9CmVycl9zdGxmIDwtIHNxcnQobWVhbigoZml0X3N0bGYkbWVhbi0gZGZfd2tfZ3BfZmMkY3Jhc2hlcyleMikpIAplcnJfc3RsZgpgYGAKCgoKCldlIHdpbGwgdHJ5IHRvIG1vZGVsIHRoZSBzZXJpZXMgd2l0aCBUQkFUUy4gCgpUaGUgdmFyaWFuY2UgaGFzIGNoYW5nZWQgYSBsb3Qgb3ZlciB0aW1lLCBzbyBpdCBuZWVkcyBhIHRyYW5zZm9ybWF0aW9uLgrigKIgVGhlIHNlYXNvbmFsaXR5IGhhcyBhbHNvIGNoYW5nZWQgc2hhcGUgb3ZlciB0aW1lLArigKIgYW5kIHRoZXJlIGlzIGEgc3Ryb25nIHRyZW5kLgpUaGlzIG1ha2VzIGl0IGFuIGlkZWFsIHNlcmllcyB0byB0ZXN0IHRoZSB0YmF0cygpIGZ1bmN0aW9uIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGVzZSBmZWF0dXJlcy4KCmBgYHtyfQpmaXRfd2syX3RiYXRzIDwtIHRiYXRzKHRzX3drMikKYGBgCgpgYGB7cn0KZml0X3drMl90YmF0cwpgYGAKYGBge3J9CmNoZWNrcmVzaWR1YWxzKGZpdF93azJfdGJhdHMpCmBgYAoKCmBgYHtyfQpmY193azJfdGJhdHMgPC0gZm9yZWNhc3QoZml0X3drMl90YmF0cywgaD0xNykKYGBgCmBgYHtyfQphdXRvcGxvdChmY193azJfdGJhdHMpCmBgYAoKYGBge3J9CmVycl90YmF0cyA8LSBzcXJ0KG1lYW4oKGZjX3drMl90YmF0cyRtZWFuLSBkZl93a19ncF9mYyRjcmFzaGVzKV4yKSkgCmVycl90YmF0cwpgYGAKCgoKCgoKV2UgdXNlZCBGb3VyaWVyIHRyYW5zZm9ybWF0aW9uIHRvIHRyYW5zZm9ybSBhIHRpbWUtZG9tYWluIHJlcHJlc2VudGF0aW9uIHRvIGEgZnJlcXVlbmN5LSBkb21haW4gcmVwcmVzZW50YXRpb24sIHdlIHdpbGwgdXNlIHRoZSBGb3VyaWVyIHRyYW5zZm9ybSB0byBkZWNvbXBvc2UgdGhlIHNlcmllcyBzaW5jZSBpdCBnb3QgYSBkeW5hbWljIHNlYXNvbmFsaXR5LgoKV2UgZmlyc3RseSBkaWQgdGhlIHNwZWN0cnVtIGFuYWx5c2lzLiBTcGVjdHJhbCBhbmFseXNpcyB3aWxsIGlkZW50aWZ5IHRoZSBjb3JyZWxhdGlvbiBvZiBzaW5lIGFuZCBjb3NpbmUgZnVuY3Rpb25zIG9mIGRpZmZlcmVudCBmcmVxdWVuY3kgd2l0aCB0aGUgb2JzZXJ2ZWQgZGF0YS4gSWYgYSBsYXJnZSBjb3JyZWxhdGlvbiAoc2luZSBvciBjb3NpbmUgY29lZmZpY2llbnQpIGlzIGlkZW50aWZpZWQsIHlvdSBjYW4gY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBhIHN0cm9uZyBwZXJpb2RpY2l0eSBvZiB0aGUgcmVzcGVjdGl2ZSBmcmVxdWVuY3kgKG9yIHBlcmlvZCkgaW4gdGhlIGRhdGEuCgpTcGVjdHJhbCBhbmFseXNpcyBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGFuYWx5c2lzIG9mIHN0YXRpb25hcnkgdGltZSBzZXJpZXMgYW5kIGZvciBpZGVudGlmeWluZyBwZXJpb2RpYyBzaWduYWxzIHRoYXQgYXJlIGNvcnJ1cHRlZCBieSBub2lzZS4gSG93ZXZlcixzcGVjdHJhbCBhbmFseXNpcyBpcyBub3Qgc3VpdGFibGUgZm9yIG5vbi1zdGF0aW9uYXJ5IGFwcGxpY2F0aW9ucy4gT25lIGdvYWwgb2Ygc3BlY3RyYWwgYW5hbHlzaXMgaXMgdG8gaWRlbnRpZnkgdGhlIGltcG9ydGFudCBmcmVxdWVuY2llcyAob3IgcGVyaW9kcykgaW4gdGhlIG9ic2VydmVkIHNlcmllcy4KCmBgYHtyfQprcHNzLnRlc3QodHNfd2syKQpgYGAKYGBge3J9CnRzX3drX2JjX2RpZmYgPC0gZGlmZih0c193a19iYykKYGBgCmBgYHtyfQprcHNzLnRlc3QodHNfd2tfYmNfZGlmZikKYGBgCmBgYHtyfQphZGYudGVzdCh0c193a19iY19kaWZmKQpgYGAKCioqKk5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQuCmBgYHtyfQphdXRvcGxvdCh0c193a19iY19kaWZmKQpgYGAKYGBge3J9CnRzZGlzcGxheSh0c193a19iY19kaWZmKQpgYGAKVG9vIG11Y2ggbm9pc2UsIHBlcmlvZG9ncmFtLgpJbnZlc3RpZ2F0ZSBvbmUgc2lnbmlmaWNhbnQgZnJlcXVlbmN5LgoKYGBge3J9CnRlbXAgPC0gcGVyaW9kb2dyYW0odHNfd2tfYmNfZGlmZikKYGBgCmBgYHtyfQptYXhfZnJlcSA8LSB0ZW1wJGZyZXFbd2hpY2gubWF4KHRlbXAkc3BlYyldCm1heF9mcmVxCmBgYApgYGB7cn0Kc2Vhc29uYWxpdHkgPC0gMS9tYXhfZnJlcQpzZWFzb25hbGl0eQpgYGAKYGBge3J9CmZpdF93azJfZm91cmllciA8LSBhdXRvLmFyaW1hKHRzX3drMiwgeHJlZz1mb3VyaWVyKHRzX3drMiwgNSksIHNlYXNvbmFsID0gRkFMU0UsIGxhbWJkYSA9IDEuNTU1NDU1KQpmaXRfd2syX2ZvdXJpZXIKYGBgCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhmaXRfd2syX2ZvdXJpZXIpCmBgYApgYGB7cn0KZmNfd2syX2ZvdXJpZXIgPC0gZm9yZWNhc3QoZml0X3drMl9mb3VyaWVyLCB4cmVnID0gZm91cmllcih0c193azIsSyA9IDUsaD0xNykpCmBgYApgYGB7cn0KYXV0b3Bsb3QoZmNfd2syX2ZvdXJpZXIpCmBgYApgYGB7cn0KYmVzdGZpdCA8LSBsaXN0KGFpY2M9SW5mKQprID0gMApmb3IoaSBpbiAxOjI1KQp7CiAgZml0X2ZvdXJpZXJfYmVzdCA8LWF1dG8uYXJpbWEodHNfd2syLCB4cmVnPWZvdXJpZXIodHNfd2syLCBpKSwgc2Vhc29uYWwgPSBGQUxTRSwgbGFtYmRhID0gMS41NTU0NTUpCiAgCiAgaWYoZml0X2ZvdXJpZXJfYmVzdCRhaWNjIDwgYmVzdGZpdCRhaWNjKXsKICAgIGJlc3RmaXQgPC0gZml0X2ZvdXJpZXJfYmVzdAogICAgayA9IGkKICB9Cn0KYGBgCgpgYGB7cn0KZmNfd2syX2ZvdXJpZXJfYmVzdCA8LSBmb3JlY2FzdChiZXN0Zml0LCB4cmVnPWZvdXJpZXIodHNfd2syLCBLPTEzLCBoPTE3KSkKYGBgCmBgYHtyfQphdXRvcGxvdChmY193azJfZm91cmllcl9iZXN0KQpgYGAKYGBge3J9CmJlc3RmaXQKYGBgCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhiZXN0Zml0KQpgYGAKYGBge3J9CmVycl9mb3VyaWVyX2Jlc3QgPC0gc3FydChtZWFuKChmY193azJfZm91cmllcl9iZXN0JG1lYW4gLSBkZl93a19ncF9mYyRjcmFzaGVzKV4yKSkKZXJyX2ZvdXJpZXJfYmVzdApgYGAKCiNSdW5uaW5nIEFSSU1BIG9uIHR3byB2YXJpYWJsZXMgZm9yIGNhciBjcmFzaGVzIChQZXJjaXBpdGF0aW9uKQoKCmBgYHtyfQphdXRvcGxvdCh0c193azMpCmBgYApgYGB7cn0Ka3Bzcy50ZXN0KHRzX3drMykKYGBgCmBgYHtyfQprcHNzLnRlc3QodHNfd2s0KQpgYGAKYGBge3J9CmF1dG9wbG90KGRpZmYodHNfd2szKSkKYGBgCmBgYHtyfQprcHNzLnRlc3QoZGlmZih0c193azMpKQpgYGAKYGBge3J9Cmxlbmd0aChkaWZmKHRzX3drMykpCmBgYAoKCgpgYGB7cn0KZml0X3drX2F1dG9fcGVyY2lwIDwtIGF1dG8uYXJpbWEodHNfd2syLCB4cmVnID0gdHNfd2szLCBsYW1iZGEgPSAxLjU1NTQ1NSwgc2Vhc29uYWw9VFJVRSkKYGBgCmBgYHtyfQpmaXRfd2tfYXV0b19wZXJjaXAKY2hlY2tyZXNpZHVhbHMoZml0X3drX2F1dG9fcGVyY2lwKQpgYGAKCmBgYHtyfQpmY193a19hdXRvX3BlcmNpcCA8LSBmb3JlY2FzdChmaXRfd2tfYXV0b19wZXJjaXAsIHhyZWcgPSBkZjJfd2tfZ3BfZmMkdG90YWxwcmVjaXBJbiAsaD0xNykKYXV0b3Bsb3QoZmNfd2tfYXV0b19wZXJjaXApCmBgYApJZiBkaWZmZXJlbmNpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBkaWZmZXJlbmNpbmcgaXMgYXBwbGllZCB0byBhbGwgdmFyaWFibGVzIGluIHRoZSByZWdyZXNzaW9uIG1vZGVsIGJlZm9yZSB0aGUgbW9kZWwgaXMgZXN0aW1hdGVkLklmIGRpZmZlcmVuY2luZyBpcyByZXF1aXJlZCwgdGhlbiBhbGwgdmFyaWFibGVzIGFyZSBkaWZmZXJlbmNlZCBkdXJpbmcgdGhlIGVzdGltYXRpb24gcHJvY2VzcywgYWx0aG91Z2ggdGhlIGZpbmFsIG1vZGVsIHdpbGwgYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIHRoZSBvcmlnaW5hbCB2YXJpYWJsZXMuCgojUnVubmluZyBBUklNQSBNQVggb24gdHdvIHZhcmlhYmxlcyBmb3IgY2FyIGNyYXNoZXMgKFZpc2liaWxpdHkpCmBgYHtyfQpmaXRfd2tfYXV0b192aXNpYmlsaXR5IDwtIGF1dG8uYXJpbWEodHNfd2syLCB4cmVnID0gdHNfd2s0LCBsYW1iZGEgPSAxLjU1NTQ1NSwgc2Vhc29uYWw9VFJVRSkKYGBgCmBgYHtyfQpmaXRfd2tfYXV0b192aXNpYmlsaXR5CmNoZWNrcmVzaWR1YWxzKGZpdF93a19hdXRvX3Zpc2liaWxpdHkpCmBgYAoKYGBge3J9CmZjX3drX2F1dG9fdmlzaWJpbGl0eSA8LSBmb3JlY2FzdChmaXRfd2tfYXV0b192aXNpYmlsaXR5LCB4cmVnID0gZGYyX3drX2dwX2ZjJHZpc2liaWxpdHlNaWxlcyAsaD0xNykKYXV0b3Bsb3QoZmNfd2tfYXV0b192aXNpYmlsaXR5KQpgYGAKCiNSdW5uaW5nIEFSSU1BIE1BWCBvbiB0d28gdmFyaWFibGVzIGZvciBjYXIgY3Jhc2hlcyAodG90YWxwcmVjaXBJbiAmIHZpc2liaWxpdHkpCmBgYHtyfQp4cmVnID0gY2JpbmQoUGVyY2lwaXRhdGlvbiA9IHRzX3drMywgVmlzaWJpbGl0eSA9IHRzX3drNCkKZml0X3drX2F1dG9fYm90aCA8LSBhdXRvLmFyaW1hKHRzX3drMiwgeHJlZyA9IHhyZWcsIGxhbWJkYSA9IDEuNTU1NDU1LCBzZWFzb25hbD1UUlVFKQpgYGAKYGBge3J9CmZpdF93a19hdXRvX2JvdGgKY2hlY2tyZXNpZHVhbHMoZml0X3drX2F1dG9fYm90aCkKYGBgCgpgYGB7cn0KeHJlZ19mYyA9IGNiaW5kKFBlcmNpcGl0YXRpb24gPSBkZjJfd2tfZ3BfZmMkdG90YWxwcmVjaXBJbiwgVmlzaWJpbGl0eSA9IGRmMl93a19ncF9mYyR2aXNpYmlsaXR5TWlsZXMpCmZjX3drX2F1dG9fYm90aCA8LSBmb3JlY2FzdChmaXRfd2tfYXV0b19ib3RoLCB4cmVnID0geHJlZ19mYyAsaD0xNykKYXV0b3Bsb3QoZmNfd2tfYXV0b19ib3RoKQpgYGAKRXZhbHVhdGlvbiBvZiBBUklNQVggbW9kZWwKCmBgYHtyfQpmY193a19hdXRvX2JvdGgKYGBgClJNU0UKCmBgYHtyfQplcnJfYXJpbWF4X2JvdGggPC0gc3FydChtZWFuKChmY193a19hdXRvX2JvdGgkbWVhbiAtIGRmX3drX2dwX2ZjJGNyYXNoZXMpXjIpKSAKZXJyX2FyaW1heF9ib3RoCmBgYAoKCiNDcm9zcyBWYWxpZGF0aW9uClRoaXMgbWV0aG9kIGhhcyB0aGUgYmVuZWZpdCBvZiBwcm92aWRpbmcgYSBtdWNoIG1vcmUgcm9idXN0IGVzdGltYXRpb24gb2YgaG93IHRoZSBjaG9zZW4gbW9kZWxpbmcgbWV0aG9kIGFuZCBwYXJhbWV0ZXJzIHdpbGwgcGVyZm9ybSBpbiBwcmFjdGljZS4KCgojSW50ZXJ2ZW50aW9uIEFuYWx5c2lzCkl0IGxvb2tzIGxpa2UgdGhhdCBzdGFydGluZyBmcm9tIHRoZSB3ZWVrIG9mIDIwMjAtMDMtMTYsIHRoZSB3ZWVrbHkgY3Jhc2ggbnVtYmVyIGhhcyBhIHNpZ25pZmljYW50IGRyb3AuIFdlIGFzc3VtZWQgdGhhdCB0aGlzIGRyb3AgaXMgdmVyeSBsaWtlbHkgY2F1c2VkIGJ5IHRoZSBleHRlcm5hbCBldmVudCAtIENPVklELTE5LiBEdWUgdG8gdGhlIHF1YXJhbnRpbmUsIHRoZXJlIHdlcmUgbGVzcyB0cmFmZmljIG9uIHRoZSByb2FkIGFuZCB0aGVyZWZvcmUsIGxlZCB0byBsZXNzIGNhciBhY2NpZGVudHMuCgpJdCBhcHBlYXJzIHRoYXQgdGhlcmUgaXMgYSBkcmFzdGljIHNoaWZ0IGluIHRoZSBzZXJpZXMsIHRoYXQgc2xvd2x5IGluY3JlYXNlZCBhbmQgZXZlbnR1YWxseSByZXR1cm5zIHRvIHByZXZpb3VzIGxldmVscy4gVGhpcyBtYXkgaW5kaWNhdGUgYW4gaW50ZXJ2ZW50aW9uIG1vZGVsIHdpdGggYSBwdWxzZSBmdW5jdGlvbiB3aGljaCBpcyB0eXBpY2FsbHkgZW1wbG95ZWQgaWYgdGhlIGVmZmVjdHMgYXJlICBleHBlY3RlZCB0byBiZSBvbmx5IHRlbXBvcmFyeSwgYW5kIGRlY2F5IG92ZXIgdGltZS4KCkF1dG8gQXJpbWE6IEFSSU1BKDAsMSwxKSgwLDAsMSlbNTJdIAoKCkFuYWx5c2lzIHdpdGggUHVsc2UgZnVuY3Rpb24KCmBgYHtyfQpjb3ZpZCA8LSAxKih0c193azIgPT0gMTIzMikKYGBgCgpgYGB7cn0KZml0X2ludHZfbW9kZWwgPC0gYXJpbWF4KGxvZyh0c193azIpLCBvcmRlcj1jKDAsMSwxKSwgc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMCwxKSxwZXJpb2Q9NTIpLCB4cmVnPXhyZWcsIHh0cmFuc2Y9Y292aWQsIHRyYW5zZmVyPWxpc3QoYygxLDApKSwgbWV0aG9kID0gJ01MJykKYGBgCgpgYGB7cn0KZml0X2ludHZfbW9kZWwKYGBgCgpgYGB7cn0KY2hlY2tyZXNpZHVhbHMoZml0X2ludHZfbW9kZWwpCmBgYApgYGB7cn0KZml0X2ludHZfbW9kZWwkY29lZgpgYGAKCmBgYHtyfQpjb3ZpZHggPC0gYyhjb3ZpZCwgcmVwKDAsMTcpKQpgYGAKCgpgYGB7cn0KaW50dl9wdWxzZSA8LSBmaXRfaW50dl9tb2RlbCRjb2VmWyJUMS1NQTAiXStzdGF0czo6ZmlsdGVyKGNvdmlkeCwgZmlsdGVyPWZpdF9pbnR2X21vZGVsJGNvZWZbIlQxLUFSMSJdLCBtZXRob2Q9InJlY3Vyc2l2ZSIsIHNpZGU9MSkKYGBgCgoKYGBge3J9CmludHZfcHVsc2VfeCA8LSBBcmltYShsb2codHNfd2syKSwgb3JkZXI9YygwLDEsMSksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDAsMSkscGVyaW9kPTUyKSwgeHJlZz1pbnR2X3B1bHNlWzE6bGVuZ3RoKHRzX3drMildKQpgYGAKYGBge3J9CmludHZfcHVsc2VfeApgYGAKYGBge3J9CmNoZWNrcmVzaWR1YWxzKGludHZfcHVsc2VfeCkKYGBgCgoKYGBge3J9CmludHZfcHVsc2VfZmMgPC0gZm9yZWNhc3QoaW50dl9wdWxzZV94LCBoPTE3LCB4cmVnPWludHZfcHVsc2VbKGxlbmd0aCh0c193azIpKzEpOihsZW5ndGgodHNfd2syKSsxNyldICkKYGBgCmBgYHtyfQppbnR2X3B1bHNlX2ZjCmBgYAoKYGBge3J9CmF1dG9wbG90KGludHZfcHVsc2VfZmMpCmBgYApgYGB7cn0KZXJyX2ludHZfcHVsc2UgPC0gc3FydChtZWFuKChleHAoaW50dl9wdWxzZV9mYyRtZWFuKSAtIGRmX3drX2dwX2ZjJGNyYXNoZXMpXjIpKSAKZXJyX2ludHZfcHVsc2UKYGBgCgpBbmFseXNpcyB3aXRoIFN0ZXAgZnVuY3Rpb24KYGBge3J9CmNvdmlkX3N0ZXAgPC0gMSooc2VxKHRzX3drMikgPj0gMjIxKQpgYGAKYGBge3J9CmZpdF9pbnR2X3N0ZXAgPC0gYXJpbWF4KGxvZyh0c193azIpLCBvcmRlcj1jKDAsMSwxKSwgc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMCwxKSxwZXJpb2Q9NTIpLCB4cmVnPXhyZWcsIHh0cmFuc2Y9Y292aWRfc3RlcCwgdHJhbnNmZXI9bGlzdChjKDEsMCkpLCBtZXRob2QgPSAnTUwnKQpgYGAKCmBgYHtyfQpmaXRfaW50dl9zdGVwCmBgYApgYGB7cn0KY2hlY2tyZXNpZHVhbHMoZml0X2ludHZfc3RlcCkKYGBgCgpgYGB7cn0KY292aWR4X3N0ZXAgPC0gYyhjb3ZpZF9zdGVwLCAgcmVwKDEsMTgpKQpgYGAKCmBgYHtyfQppbnR2X3N0ZXAgPC0gZml0X2ludHZfc3RlcCRjb2VmWyJUMS1NQTAiXStzdGF0czo6ZmlsdGVyKGNvdmlkeF9zdGVwLCBmaWx0ZXI9Zml0X2ludHZfc3RlcCRjb2VmWyJUMS1BUjEiXSwgbWV0aG9kPSJyZWN1cnNpdmUiLCBzaWRlPTEpCmBgYAoKYGBge3J9CmludHZfc3RlcF94IDwtIEFyaW1hKGxvZyh0c193azIpLCBvcmRlcj1jKDAsMSwxKSwgc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMCwxKSxwZXJpb2Q9NTIpLCB4cmVnPWludHZfc3RlcFsxOmxlbmd0aCh0c193azIpXSkKYGBgCgoKYGBge3J9CmludHZfc3RlcF94CmBgYApgYGB7cn0KaW50dl9zdGVwX2ZjIDwtIGZvcmVjYXN0KGludHZfc3RlcF94LCBoPTE3LCB4cmVnPWludHZfc3RlcFsobGVuZ3RoKHRzX3drMikrMSk6KGxlbmd0aCh0c193azIpKzE3KV0gKQpgYGAKYGBge3J9CmF1dG9wbG90KGludHZfc3RlcF9mYykKYGBgCmBgYHtyfQpleHAoaW50dl9zdGVwX2ZjJG1lYW4pCmBgYAoKYGBge3J9CmVycl9pbnR2X3N0ZXAgPC0gc3FydChtZWFuKChleHAoaW50dl9zdGVwX2ZjJG1lYW4pIC0gZGZfd2tfZ3BfZmMkY3Jhc2hlcyleMikpIAplcnJfaW50dl9zdGVwCmBgYAoKCgoKCgo=